home *** CD-ROM | disk | FTP | other *** search
/ HAM Radio 3.2 / Ham Radio Version 3.2 (Chestnut CD-ROMs)(1993).ISO / packet / n17jsrc / fingerd.c < prev    next >
C/C++ Source or Header  |  1991-04-28  |  2KB  |  107 lines

  1. /* Internet Finger server */
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "global.h"
  5. #include "files.h"
  6. #include "mbuf.h"
  7. #include "socket.h"
  8. #include "session.h"
  9. #include "proc.h"
  10. #include "dirutil.h"
  11. #include "commands.h"
  12. #include "mailbox.h"
  13.  
  14. static int Sfinger = -1;    /* Prototype socket for service */
  15.  
  16. static void fingerd __ARGS((int s,void *unused,void *p));
  17.  
  18. /* Start up finger service */
  19. int
  20. finstart(argc,argv,p)
  21. int argc;
  22. char *argv[];
  23. void *p;
  24. {
  25.     struct sockaddr_in lsocket;
  26.     int s;
  27.  
  28.     if(Sfinger != -1){
  29.         return 0;
  30.     }
  31.     psignal(Curproc,0);    /* Don't keep the parser waiting */
  32.     chname(Curproc,"Finger listener");
  33.  
  34.     lsocket.sin_family = AF_INET;
  35.     lsocket.sin_addr.s_addr = INADDR_ANY;
  36.     if(argc < 2)
  37.         lsocket.sin_port = IPPORT_FINGER;
  38.     else
  39.         lsocket.sin_port = atoi(argv[1]);
  40.  
  41.     Sfinger = socket(AF_INET,SOCK_STREAM,0);
  42.     bind(Sfinger,(char *)&lsocket,sizeof(lsocket));
  43.     listen(Sfinger,1);
  44.     for(;;){
  45.         if((s = accept(Sfinger,NULLCHAR,(int *)NULL)) == -1)
  46.             break;    /* Service is shutting down */
  47.  
  48.         /* Spawn a server */
  49.         newproc("fingerd",512,fingerd,s,NULL,NULL,0);
  50.     }
  51.     return 0;
  52. }
  53. static void
  54. fingerd(s,unused,p)
  55. int s;
  56. void *unused;
  57. void *p;
  58. {
  59.     char user[80];
  60.     FILE *fp;
  61.     char *file,*cp;
  62.  
  63.     sockmode(s,SOCK_ASCII);
  64.     sockowner(s,Curproc);
  65.     log(s,"open Finger");
  66.     recvline(s,user,80);
  67.     rip(user);
  68.     if(strlen(user) == 0){
  69.         fp = dir(Fdir,0);
  70.         if(fp == NULLFILE)
  71.             usprintf(s,"No finger information available\n");
  72.         else
  73.             usprintf(s,"Known users on this system:\n");
  74.     } else {
  75.         file = pathname(Fdir,user);
  76.         cp = pathname(Fdir,"");
  77.         /* Check for attempted security violation (e.g., somebody
  78.          * might be trying to finger "../ftpusers"!)
  79.          */
  80.         if(strncmp(file,cp,strlen(cp)) != 0){
  81.             fp = NULLFILE;
  82.             usprintf(s,"Invalid user name %s\n",user);
  83.         } else if((fp = fopen(file,READ_TEXT)) == NULLFILE)
  84.             usprintf(s,"User %s not known\n",user);
  85.         free(cp);
  86.         free(file);
  87.     }
  88.     if(fp != NULLFILE){
  89.         sendfile(fp,s,ASCII_TYPE,0);
  90.         fclose(fp);
  91.     }
  92.     if(strlen(user) == 0 && Listusers != NULL)
  93.         (*Listusers)(s);
  94.     close_s(s);
  95.     log(s,"close Finger");
  96. }
  97. int
  98. fin0(argc,argv,p)
  99. int argc;
  100. char *argv[];
  101. void *p;
  102. {
  103.     close_s(Sfinger);
  104.     Sfinger = -1;
  105.     return 0;
  106. }
  107.